/*
 * FullSearchPattrnOptTrim.java
 *
 * Created on 29 Март 2008 г., 16:36
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package trim.calc;

/**
 * Алгоритм с полным перебором всех базисных подматриц
 * @author Дмитрий
 */
public class FullSearchPattrnOptTrim //extends SMExtensionTrimBase
{
//
//  /** Creates a new instance of FullSearchPattrnOptTrim */
//  public FullSearchPattrnOptTrim()
//  {
//  }
//
//  protected int SMOptimization(SMData smData)
//  {
//    smData.n=n;
//    int[][] zcols=SMGetZeroCols(smData);
//    smData.n++;
//    MinCutting(smData,zcols);
//    return 0;
//  }
//
//  private void MinCutting(SMData smData, int[][] ZCols)
//  {
//    //double *z
//    //n++;
//    int n=smData.n;
//    int i,j,k,l;
//    int []g=new int[smData.m+2];
//    int []tau=new int[smData.m+2];
//    int []Comb=new int[n];
//    int []r=new int[n];
//    int [][]Xmin=new int[n][n];
//    double []Resmin=new double[n];
//    double []z=new double[n];
//    int in,out,t;
//    int rec;
//    double fr,fr1;
//
//
//    boolean IsSignular=true;
//    for(i=0;i<n;i++)
//      Xmin[i]=new int[n];
//    for(i=0;i<n;i++)
//      for(j=0;j<n;j++)
//        Xmin[i][j]=smData.X[i][j];
//
//
//    for(j=1;j<=n;j++)
//    {
//      g[j]=1;
//      tau[j]=j+1;
//      Comb[j-1]=j;
//    }
//    for(j=n+1;j<=smData.m+1;j++)
//    {
//      g[j]=0;
//      tau[j]=j+1;
//    }
//    rec=0;
//    fr=0.0;
//    for(i=0;i<n;i++)
//    {
//      if(smData.SMRes[i]<=0.9+1e-9)rec++;
//      fr+=smData.SMRes[i]-Math.floor(smData.SMRes[i]+1e-10);
//      Resmin[i]=smData.SMRes[i];
//    }
//    t=n; tau[1]=n+1; i=0;
//    in=out=0;
//    int cnt=0;
//
////fstream f;
////f.open("d:\\out1.txt",ios::out);
//    //time_t tmStart,tmEnd;
//    //time(&tmStart);
//    while(i!=smData.m+1)
//    {
//      //time(&tmEnd);
//      //if(tmEnd-tmStart>180)break;
//      cnt++;
//      if(in!=0)
//      {
//        //вставка нового столбца в базис
//        for(j=0;j<n&&Comb[j]!=out;j++);
//        l=j;Comb[l]=in;
//        for(j=0;j<n-0;j++)
//          r[j]=ZCols[j][in-1];
//        r[n]=1;
//        if(IsSignular)
//          IsSignular=SMNextBase(l,0.0,z,smData);
//        else
//        {
//          for(j=0;j<n;j++)
//            smData.X[j][l]=r[j];
//          if(IsSignular=mxInvert(smData))
//          {
//            //вычисление двойственных переменных
//            //for(k=0;k<n;k++)
//            //{
//            //	V[k]=0;
//            //	for(j=0;j<n;j++)
//            //		V[k]=V[k]+X1[j][k];
//            //}
//            //вычисление вектора решения для нового базиса
//            for(k=0;k<n;k++)
//            {
//              smData.SMRes[k]=0;
//              for(j=0;j<n;j++)
//                smData.SMRes[k]=smData.SMRes[k]+smData.X1[k][j]*L[j];
//            }
//          }
//
//        }
//        if(IsSignular)
//        {
//          k=l=0;
//          fr1=0.0;
//          for(j=0;j<n;j++)
//          {
//            if(Math.abs(smData.SMRes[j])<1.0+1e-9)k++;
//            if(smData.SMRes[j]<-1e-9)l++;
//            fr1+=smData.SMRes[j]-Math.floor(smData.SMRes[j]+1e-10);
//          }
//          if(l==0&&(k>rec||(k==rec&&fr1<fr)))
//          {
//            double rrr=0;
//            for(j=0;j<n;j++)
//              rrr+=smData.SMRes[j];
//
//            rec=k;
//            fr=fr1;
//            for(j=0;j<n;j++)Resmin[j]=smData.SMRes[j];
//
//            for(j=0;j<n;j++)
//              for(k=0;k<n;k++)
//                Xmin[j][k]=smData.X[j][k];
//
//              /*for(i=1;i<=m;i++)
//                      f<<g[i]<<(char)9;
//              f<<rrr<<"\n";
//              for(j=0;j<n;j++)
//              {
//                      for(k=0;k<n;k++)
//                              f<<X[j][k]<<(char)9;
//                      f<<"\n";
//              }
//              f<<"\n";
//              for(j=0;j<n;j++)
//              {
//                      for(k=0;k<n;k++)
//                              f<<X1[j][k]<<(char)9;
//                      f<<"\n";
//              }
//              f<<"\n\n";*/
//
//          }
//        }
//      }
//
//
//      i=tau[1];
//      tau[1]=tau[i];
//      tau[i]=i+1;
//      if(g[i]==1)
//      {
//        if(t!=0)
//        {
//          in=t;
//          g[t]=1&(~g[t]);
//        }
//        else
//        {
//          in=i-1;
//          g[i-1]=1&(~g[i-1]);
//        }
//        t+=1;
//      }
//      else
//      {
//        if(t!=1)
//        {
//          g[t-1]=1&(~g[t-1]);
//          in=t-1;
//        }
//        else
//        {
//          in=i-1;
//          g[i-1]=1&(~g[i-1]);
//        }
//        t-=1;
//      }
//      g[i]=1&(~g[i]);
//      if(g[i]==1)
//      {
//        out=in;
//        in=i;
//      }
//      else	out=i;
//
//      if((t==i-1)||t==0)t=t+1;
//      else
//      {
//        t=t-g[i-1];
//        tau[i-1]=tau[1];
//        if(t==0)tau[1]=i-1;
//        else tau[1]=t+1;
//      }
//    }
//
////f.close();
//
//    for(i=0;i<n;i++)smData.SMRes[i]=Resmin[i];
//
//    for(i=0;i<n;i++)
//      for(j=0;j<n;j++)smData.X[i][j]=Xmin[i][j];
//
//
//        return;
//  }
//
//  private boolean mxInvert(SMData smData)
//  {
//    boolean LNZ=false;
//    double [][]a=new double[2*n][n];
//    int []srt=new int[n];
//    //Копируем X в левую часть a
//    int i;
//
//    for( i=0;i<n;i++)
//    {
//      for(int j=0;j<n;j++)
//      {
//        a[i][j]=(double)smData.X[j][i];
//        a[i+n][j]=0;
//      }
//    }
//    //Правую часть a заполняем 1
//    for(i=0;i<n;i++)
//    {
//      a[i+n][i]=1;
//      srt[i]=i;
//    }
//
//
//    int l=-1;
//    int r1;
//    double r,maxi,c;
//    int w;
//    LNZ=true;
//    for(i=0;i<n;i++)
//    {
//      maxi=1e-11;r1=i;
//      for(int ii=i;ii<n;ii++)
//      {
//        if(Math.abs(a[i][ii])>maxi)
//        {
//          maxi=Math.abs(a[i][ii]);
//          r1=ii;
//        }
//      }
//      if(maxi>1e-11)
//      {
//        srt[i]=r1;
//        for(w=i;w<2*n;w++)
//        {
//          c=a[w][i];
//          a[w][i]=a[w][r1];
//          a[w][r1]=c;
//        }
//        l++;
//        r=a[l][i];
//        for(int j=l;j<2*n;j++)
//        {
//          a[j][i]=a[j][i]/r;
//        }
//        for(int q=i+1;q<n;q++)
//        {
//          r=a[l][q];
//          for(int j=l;j<2*n;j++)
//          {
//            a[j][q]=a[j][q]-a[j][l]*r;
//          }
//        }
//      }
//      else
//      {
//                        /*for(i=0;i<2*n;i++)
//                                delete [] a[i];
//                        delete [] a;
//                        delete [] srt;*/
//        return false;}
//    }
//
//    l=n;
//    for(i=n-2;i>=0;i--)
//    {
//      l--;
//      //r=a[l][i+1];
//      //for(int j=l;j<2*n;j++){
//      //	a[j][i+1]=a[j][i+1]/r;
//      //}
//      for(int q=i;q>=0;q--)
//      {
//        r=a[l][q];
//        for(int j=l;j<2*n;j++)
//        {
//          a[j][q]=a[j][q]-a[j][l]*r;
//        }
//      }
//    }
//
//    //for(i=n-2;i>=0;i--)
//    //	if(srt[i]!=i)
//    //		for(w=n;w<2*n;w++){
//    //			c=a[w][i];
//    //			a[w][i]=a[w][srt[i]];
//    //			a[w][srt[i]]=c;
//    //		}
//
//    for(i=0;i<n;i++)
//      for(int j=0;j<n;j++)
//        smData.X1[i][j]=a[j+n][i];
//
//        /*for(i=0;i<2*n;i++)
//                delete [] a[i];
//        delete [] a;
//        delete [] srt;*/
//
//    return LNZ;
//  }
//
//
}
